
package jp.ize.iwp.utils;

#if flash9
import flash.display.Sprite;
import flash.display.MovieClip;
import flash.display.Loader;
#elseif flash
import flash.MovieClip;
import jp.ize.iwp.avm1.display.Loader;
import jp.ize.iwp.avm1.display.Sprite;
#end

/**
* ClassUtil クラスです。<br />
* 文字列からクラスのインスタンスを取得したりするユーティリティクラスです。
* Flash の Sprite や MovieClip を継承したクラスを取得したりできます。
*/
class ClassUtil
{
	// {{{ properties
	/** Flash Player 8 以下用の MovieClip の子要素管理のための変数です。 */
	public static var count:Int = 0;

	// }}}
	// {{{ public static function getInstance( name:String, ?ldr:Loader ) : Dynamic
	/**
	* クラス名文字列を渡してクラスのインスタンスを取得します。
	* 第2引数は、Flash Player 8 以下のとき親MovieCLip を指定します。
	* インスタンスが取得できなかった場合 null を返します。
	* インスタンスの取得に失敗した場合に Exception をスローします。
	*/
	public static function getInstance( name:String, ?ldr:Loader ) : Dynamic
	{
		try {
			#if flash9
			var cls = Type.resolveClass(name);
			var obj = null;
			if ( cls!=null ) {
				obj = Type.createInstance(cls,[]);
			} else {
				return null;
			}
			#elseif flash
			var lib = ldr.content;
			//parent._width  = 300;
			//parent._height = 500;
			var parent = flash.Lib._root;
			var n:String = "n" + Std.string(count);
			var obj = lib.attachMovie( name, n, lib.getNextHighestDepth() );
			count++;
			#end
			return obj;
		} catch ( e:Dynamic ) {
			throw e;
		}
	}

	// }}}
	// {{{ public static function getSprite( name:String, ?ldr:Loader ) : Dynamic
	/**
	* getInstance() と同等です。
	* インスタンスが取得できなかった場合、新規に Sprite のインスタンスを生成し返します。
	*/
	public static function getSprite( name:String, ?ldr:Loader ) : Dynamic
	{
		try {
			#if flash9
			var cls = Type.resolveClass(name);
			var obj = null;
			if ( cls!=null ) {
				obj = Type.createInstance(cls,[]);
			} else {
				return new Sprite();
			}
			#elseif flash
			var lib = ldr.content;
			//parent._width  = 300;
			//parent._height = 500;
			var parent = flash.Lib._root;
			var n:String = "n" + Std.string(count);
			var obj = lib.attachMovie( name, n, lib.getNextHighestDepth() );
			count++;
			#end
			return obj;
		} catch ( e:Dynamic ) {
			return new Sprite();
		}
	}

	// }}}
	// {{{ public static function getMovieClip( name:String, ?ldr:Loader ) : Dynamic
	/**
	* getInstance() と同等です。
	* インスタンスが取得できなかった場合、新規に MovieClip のインスタンスを生成し返します。
	*/
	public static function getMovieClip( name:String, ?ldr:Loader ) : Dynamic
	{
		try {
			#if flash9
			var cls = Type.resolveClass(name);
			var obj = null;
			if ( cls!=null ) {
				obj = Type.createInstance(cls,[]);
			} else {
				return new MovieClip();
			}
			#elseif flash
			var lib = ldr.content;
			//parent._width  = 300;
			//parent._height = 500;
			var parent = flash.Lib._root;
			var n:String = "n" + Std.string(count);
			var obj = lib.attachMovie( name, n, lib.getNextHighestDepth() );
			count++;
			#end
			return obj;
		} catch ( e:Dynamic ) {
			#if flash9
			return new MovieClip();
			#elseif flash
			var lib = ldr.content;
			var n:String = "n" + Std.string(count);
			count++;
			return lib.createEmptyMovieClip( n, lib.getNextHighestDepth() );
			#end
		}
	}

	// }}}
}
